package com.hs.server.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;

public class MD5Encryption {
  private MD5Encryption() {
    throw new Error("请不要实例化工具类");
  }
  /**
   * 根据Key_Value对除了jyw和jyw_key的参数进行拼接并比较
   * @param parameters 待加密的字符串集合
   * @return 加密后的字符串
   */
  public static boolean encryptionAndCompare(Map<String, String> parameters) throws UnsupportedEncodingException, NoSuchAlgorithmException {
    String[] jyw_key = parameters.get("jyw_key").split(",");
    String jyw = parameters.get("jyw") == null ? "" : parameters.get("jyw");
    StringBuilder sb = new StringBuilder();
    for (String s : jyw_key) {
      if (!StringUtils.isEmpty(parameters.get(s)) && (!s.equals("jyw") || !s.equals("jyw_key"))) {
        sb.append(parameters.get(s));
      }
    }
    return jyw.equals(encryption(sb.toString()));
  }
  /**
   * 根据Key_Value对除了jyw和jyw_key的参数进行拼接并比较
   *
   * @param jsonStr 包含jyw,jyw_key,data待验证的json字符串
   * @return 对比结果
   */
  public static boolean encryptionAndCompare(String jsonStr) throws UnsupportedEncodingException, NoSuchAlgorithmException {
    JSONArray jsonArray = JSON.parseArray(jsonStr);
    //JSONObject(body里只有一组数据
//        if(jsonObj instanceof JSONObject) {
//            JSONObject jsonObject = JSONObject.parseObject(jsonStr);
//            String jyw = jsonObject.getString("jyw");
//            System.out.println(encryption(formatToString(jsonObject)));
//            return jyw.equals(encryption(formatToString(jsonObject)));
//        }
//
//        //JSONArray(body里包含多组数据
//        if(jsonObj instanceof JSONArray) {
//            JSONArray jsonArray = JSONArray.parseArray(jsonStr);
    for (int i = 0; i < jsonArray.size(); i++) {
      String jyw = jsonArray.getJSONObject(i).getString("jyw");
      if (!jyw.equals(encryption(formatToString(jsonArray.getJSONObject(i))))) {
        return false;
      }
    }
    return true;
//        }
//        return false;
  }
  /**
   * md5加密 32位 小写
   * @param plainText 需要加密的字符串
   * @return
   */
  public static String encryption(String plainText) {
    String re_md5 = new String();
    try {
      MessageDigest md = MessageDigest.getInstance("MD5");
      md.update(plainText.getBytes());
      byte b[] = md.digest();
      int i;
      StringBuffer buf = new StringBuffer("");
      for (int offset = 0; offset < b.length; offset++) {
        i = b[offset];
        if (i < 0)
          i += 256;
        if (i < 16)
          buf.append("0");
        buf.append(Integer.toHexString(i));
      }
      re_md5 = buf.toString();
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    }
    return re_md5;
  }
  public static String formatToString(JSONObject jsonObject) {
    StringBuffer sb = new StringBuffer("");
    String[] jyw_key = jsonObject.getString("jyw_key").split(",");
    JSONObject data = jsonObject.getJSONObject("data");
    for (String s : jyw_key) {
      if (!StringUtils.isEmpty(data.getString(s))) {
        sb.append(data.getString(s));
      }
    }
    return sb.toString();
  }

}
